home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / mmlc / source / m2itlmac.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-17  |  5.1 KB  |  256 lines

  1. /* ------------------------------------------------------------------
  2.                         MML compiler [M2]
  3.                programmed by S.Yamamoto (SHINNOSUKE)
  4.                    m2itlmac.c  --  内部マクロ
  5. ------------------------------------------------------------------ */
  6.  
  7. #include    <stdio.h>
  8. #include    <stdlib.h>
  9. #include    <ctype.h>
  10. #include    <string.h>
  11. #include    <limits.h>
  12. #include    "m2.h"
  13.  
  14. #define    SUCCSESS    0
  15. #define    FAILURE    (-1)
  16. #define    TRUE    1
  17. #define    FALSE    0
  18. #define    ERR    (-1)
  19. #define    YES    1
  20. #define    NO    0
  21.  
  22. #define    ABS(x)    ((x)>0?(x):-(x))
  23. #define    CHECKSUM(x)    (((x)%128!=0)?128-(x)%128:0)
  24.  
  25. static    char    *itlMac[] = {
  26.     "SLIDE",
  27.     "WAVE",
  28.     "CSLIDE",
  29.     "CWAVE",
  30.     "SCVLTR",
  31.     "SCVDOT",
  32.     "\0"
  33. };
  34.  
  35. static    int    itlPNum[] = { 5 ,6 ,5 ,6 ,0 ,16 };
  36.  
  37.  
  38. /* 内部マクロ */
  39. /*
  40.    _SLIDE(function mode,start pitch,end pitch,wait,number)
  41.    _WAVE(sinpuku,tyuuou,speed,wait,number)
  42.    _CSLIDE(control change number,...)
  43.    _CWAVE(control change number,...)
  44.    _SCVLTR("strings")
  45.    _SCVDOT(?(0b00000000),?(0b00000000),...
  46.            ?(0b00000000),?(0b00000000)))
  47. */
  48.  
  49. int    getIMPara( char **rp ,int mode ,int min ,int max ,char *msg )
  50. {
  51.     int    ret;
  52.     int    dummy;
  53.  
  54.     ret = readPara( min ,max ,max+1 ,msg );
  55.     dummy = ( mode == 0 ) ? ',' :')';
  56.     if( readData() != dummy )
  57.         errMsg( MSG_misopd ,msg );
  58.     *rp += 1;
  59.     return( ret );
  60. }
  61.  
  62. /* アートキャンバス */
  63.  
  64. void    acvDispLtr( unsigned short t ,char **rp ,char *msg )
  65. {
  66.     char    buf[41];
  67.  
  68.     int    ex = 7;
  69.     int    sum = 0x10;
  70.     int    dat;
  71.  
  72.     if( readData() != '"' )
  73.         errMsg( MSG_misopd ,msg );
  74.     *rp += 1;
  75.  
  76.     buf[0] = 0x41;
  77.     buf[1] = 0x10;
  78.     buf[2] = 0x45;
  79.     buf[3] = 0x12;
  80.     buf[4] = 0x10;
  81.     buf[5] = 0x00;
  82.     buf[6] = 0x00;
  83.  
  84.     for(;;) {
  85.         dat = **rp;
  86.         if( dat == '\0' ) {
  87.             skipLine( rp );
  88.             continue;
  89.         }
  90.         *rp += 1;
  91.         if( dat == '"' )
  92.             break;
  93.         if( dat < 32 || dat > 127)
  94.             dat = 32;
  95.         if( ex >= 32+7)
  96.             errMsg( MSG_misopd ,msg );
  97.         buf[ex] = dat;
  98.         sum += dat;
  99.         ex++;
  100.     }
  101.     *rp += 1;
  102.     buf[ex] = CHECKSUM( sum );
  103.     exclBank( t ,0xf0 ,ex+1 ,&buf[0] );
  104.     return;
  105. }
  106.  
  107. void    acvDispDot( unsigned short t ,char **rp ,char *msg )
  108. {
  109.     char    *buf;
  110.     char    bufDummy[80];
  111.  
  112.     int    dot[16][16];
  113.     int    i;
  114.     int    j;
  115.     int    k;
  116.     int    dummy;
  117.     int    dat;
  118.     int    m;
  119.     int    sum = 0x10+0x01+0x00;
  120.  
  121.     static    int    head[] =
  122.         { 0x41 ,0x10 ,0x45 ,0x12 ,0x10 ,0x01 ,0x00 };
  123.  
  124.     buf = &bufDummy[0];
  125.     for( i=0;i<7;i++ )
  126.         buf[i] = head[i];
  127.     buf += 7;
  128.  
  129.     for( i=0;i<16;i++ ) {
  130.         for( j=0;j<2;j++ ) {
  131.             dummy = getIMPara( rp,((i==15&&j==1)?1:0),0,255,msg );
  132.             for( k=0;k<8;k++ )
  133.                 dot[j*8+k][i] = (dummy & power(2,7-k)) >> (7-k);
  134.         }
  135.     }
  136.     for( j=0;j<4;j++ ) {
  137.         for( i=0;i<16;i++ ) {
  138.             dat = 0;
  139.             for( k=0;k<5;k++ ) {
  140.                 m = ( j == 3 && k != 0 )? 0 :dot[j*5+k][i];
  141.                 dat = ( dat << 1 ) + m;
  142.             }
  143.             sum = sum + dat;
  144.             *buf = dat;
  145.             buf++;
  146.         }
  147.     }
  148.     sum = sum % 128;
  149.     sum = ( sum != 0 )? 128-sum :sum;
  150.     *buf = sum;
  151.     exclBank( t ,0xf0 ,72 ,&bufDummy[0] );
  152.     return;
  153. }
  154.  
  155. /* 内部マクロメイン */
  156. void    itlMacro( char **rp ,unsigned short *tc ,int *exclCt ,int part )
  157. {
  158.     char    *msg = "internal macro";
  159.  
  160.     int    imc;
  161.     int    clChg;
  162.     int    sldFnc;
  163.     int    bend1;
  164.     int    bend2;
  165.     int    wLen;
  166.     int    wNum;
  167.     int    spd;
  168.     int    para;
  169.     int    i;
  170.     int    max;
  171.     int    min;
  172.     int    dummy;
  173.  
  174.     unsigned    short    timeCt = *tc;
  175.  
  176.     imc = comSearch( itlMac ,*rp );
  177.     if( imc == ERR )
  178.         errMsg( MSG_freerr ,"Undefined this internal macro" );
  179.     *rp += strlen( itlMac[imc] );
  180.  
  181.     if( readData() != '(' )
  182.         errMsg( MSG_misopd ,msg );
  183.     *rp += 1;
  184.  
  185.     if( imc == 5 ) {
  186.         acvDispDot( *tc ,rp ,msg );
  187.         goto    Point;
  188.     }
  189.     if( imc == 4 ) {
  190.         acvDispLtr( *tc ,rp ,msg );
  191.         goto    Point;
  192.     }
  193.     if( imc == 2 || imc == 3 )
  194.         clChg = getIMPara( rp ,0 ,0 ,127 ,msg );
  195.     if( imc == 0 || imc == 2 )
  196.         sldFnc = getIMPara( rp ,0 ,1 ,2 ,msg );
  197.     if( imc == 0 || imc == 1 ) {
  198.         max = 8191;
  199.         min = -8192;
  200.     } else {
  201.         max = 127;
  202.         min = 0;
  203.     }
  204.     if( imc >= 0 || imc <= 3 ) {
  205.         bend1 = getIMPara( rp ,0 ,min ,max ,msg );
  206.         bend2 = getIMPara( rp ,0 ,min ,max ,msg );
  207.     }
  208.     if( imc == 1 || imc == 3 )
  209.         spd = getIMPara( rp ,0 ,-180 ,180 ,msg );
  210.     if( imc >= 0 && imc <= 3 ) {
  211.         wLen = getIMPara( rp ,0 ,1 ,192 ,msg );
  212.         wNum = getIMPara( rp ,1 ,1 ,256 ,msg );
  213.     }
  214.  
  215.     switch( imc ) {
  216.         case 0:
  217.         case 2:    /* ----- _SLIDE/_CSLIDE */
  218.             dummy = bend2 - bend1;
  219.             dummy = dummy / ABS( dummy ) + dummy;
  220.             para = bend1;
  221.             for( i=0;i<=wNum;i++ ) {
  222.                 if( i == wNum )
  223.                     para = bend2;
  224.                 if( imc == 0 ) {
  225.                     para += 8192;
  226.                     evntPut( timeCt,0xe0+part,para & 0x7f,(para & 0x3f80) >> 7 );
  227.                 } else
  228.                     evntPut( timeCt,0xb0+part,clChg,para );
  229.                 if( i == wNum )
  230.                     break;
  231.                 timeCt += 192 / wLen;
  232.                 para = bend1+(dummy/power( wNum ,sldFnc ))*power( i+1,sldFnc );
  233.             }
  234.             break;
  235.         case 1:
  236.         case 3:    /* ----- _WAVE/_CWAVE */
  237.             for( i=0;i<wNum;i++ ) {
  238.             para = bend2 + bend1 * sine( i * spd );
  239.             if( para > max )
  240.                 para = max;
  241.             if( para < min )
  242.                 para = min;
  243.                 if( imc == 1 ) {
  244.                     para += 8192;
  245.                     evntPut( timeCt,0xe0+part,para & 0x7f,(para & 0x3f80) >> 7 );
  246.                 } else
  247.                     evntPut( timeCt,0xb0+part,clChg,para );
  248.                 timeCt += 192 / wLen;
  249.             }
  250.             break;
  251.     }
  252. Point:
  253.     *tc = timeCt;
  254.     return;
  255. }
  256.